/*
The MIT License (MIT)

Copyright (c) 2021 Pierre Lindenbaum

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.


History:
* 2015 creation

*/
package com.github.lindenb.jvarkit.tools.misc;

import htsjdk.samtools.Cigar;
import htsjdk.samtools.CigarElement;
import htsjdk.samtools.CigarOperator;
import htsjdk.samtools.SAMFileHeader;
import htsjdk.samtools.SAMFileWriter;
import htsjdk.samtools.SAMProgramRecord;
import htsjdk.samtools.SAMRecord;
import htsjdk.samtools.SAMRecordIterator;
import htsjdk.samtools.SamReader;
import htsjdk.samtools.fastq.FastqReader;
import htsjdk.samtools.fastq.FastqRecord;
import htsjdk.samtools.util.CloserUtil;

import java.io.File;
import java.util.List;

import com.beust.jcommander.Parameter;
import com.beust.jcommander.ParametersDelegate;
import com.github.lindenb.jvarkit.util.bio.AcidNucleics;
import com.github.lindenb.jvarkit.util.jcommander.Launcher;
import com.github.lindenb.jvarkit.util.jcommander.Program;
import com.github.lindenb.jvarkit.util.log.Logger;
import com.github.lindenb.jvarkit.util.picard.SAMSequenceDictionaryProgress;

/**

BEGIN_DOC
## Example

```bash
$ curl -sL "https://gist.githubusercontent.com/sjackman/789dea10bce31995cf55/raw/fb75d181976884fc424d8b2a80c77de3961e11bb/reads.sam" |\
   java -jar dist/samretrieveseqandqual.jar \
      -F <(curl -sL "https://gist.githubusercontent.com/sjackman/789dea10bce31995cf55/raw/5d93962e83e9401d4bda6de889151092d54e77fc/reads.fq")

@HD	VN:1.4	SO:unsorted
@SQ	SN:0	LN:1000
@PG	ID:0	PN:SamRetrieveSeqAndQual	VN:bfc4fe33e562e58d17b8b7048a9ab76f797a8f29	CL:-F /dev/fd/63
1	0	0	81	255	75M	*	0	0	TTTGCTGCCTAAGGCGGAATGACAGCGAAATGCGCAGAGCTTAACTTATTGATGTGTTGCCGTGATAGGTGGTGT	555555555555555555555555555555555555555555555555555555555555555555555555555
2	0	0	492	255	75M	*	0	0	GTCTACTAGAGTACTCCACTTTAATTTCAGCCCCGTCCTCCTCGCGTGTTCCGCTACCGCGAGTATACAAACCGC	555555555555555555555555555555555555555555555555555555555555555555555555555
3	0	0	846	255	75M	*	0	0	AGCTCCTGAGAACGGCTCTTCTCGAGCGTGGCATTGATAACGTTTCACGTTATGCAATTGGCTACAGCCAGTTCG	555555555555555555555555555555555555555555555555555555555555555555555555555
4	0	0	471	255	75M	*	0	0	GCGGAACACGCGAGGAGGACGGGGCTGAAATTCAAGTGGAGTACTCTAGTAGACTAGGAGCGTCGCTGTCTAGTT	555555555555555555555555555555555555555555555555555555555555555555555555555
5	0	0	846	255	75M	*	0	0	AGCTGCTGAGAACGGCTCTTCTCGAGCGAGGCATTGATAACGTTTCACGTTATCCAATTGGCTACAGCCAGTTCG	555555555555555555555555555555555555555555555555555555555555555555555555555
6	0	0	437	255	75M	*	0	0	GTTCGTTAGATCCCTGAAGGAGTAATAATTGGGTAACTAGACAGCGACGCTCCTAGTCTACTAGAGTACTCCACT	555555555555555555555555555555555555555555555555555555555555555555555555555
7	0	0	468	255	75M	*	0	0	GGTAACTAGACAGCGACGCTCCTAGTCTACTAGAGTACTCCACTTTAATTTCAGCCCCGTCCTCCTCGCGTGTTC	555555555555555555555555555555555555555555555555555555555555555555555555555
8	0	0	492	255	75M	*	0	0	GCGGTTTGTATACTCGCGGTAGCGGAACACGCTAGGAGGACGGGGCTGAAATTAAAGTGGAGTACTCTAGTAGAC	555555555555555555555555555555555555555555555555555555555555555555555555555
9	0	0	114	255	75M	*	0	0	GCAGAGCTTAACTTATTGATGTGTTGCCGTGATAGGTGGTGTCTATGCTTCATTGACTCGCACCGAGGAGTTAGC	555555555555555555555555555555555555555555555555555555555555555555555555555
10	0	0	429	255	75M	*	0	0	ACTCTAGTAGACAAGGAGCGTCGCTGACTAGTTACCCAATTATTACTCCTTCAGGGATCAAACGAACCGCAAATT	555555555555555555555555555555555555555555555555555555555555555555555555555
11	0	0	593	255	75M	*	0	0	TACCCCAGGCGTCCAATGTTGCTAGTCCCGGACCCGAGCTGCCAGATGCAGCGTTCTAAGTTCTCGACACCTCTG	555555555555555555555555555555555555555555555555555555555555555555555555555
12	0	0	869	255	75M	*	0	0	TAACGTGAAACGTTATCAATGCCACGCTCGAGAAGAGCCGTTCTCAGGAGCTGCGCTTGTGCCTCTATCCAAAGC	555555555555555555555555555555555555555555555555555555555555555555555555555
13	0	0	818	255	75M	*	0	0	AGCCTTTAATAGGCAGGTCCAGGGACACCGAACTGGCTGTAGCCAATTGGATAACGTGAAACGTTATCAATGCCA	555555555555555555555555555555555555555555555555555555555555555555555555555
14	0	0	103	255	75M	*	0	0	GGTGCGAGTCAATGAAGCATAGACCCCACCTATCACGGCAACACATCAATAAGTTAAGCTCTGCGCATTTCGCTG	555555555555555555555555555555555555555555555555555555555555555555555555555
15	0	0	211	255	75M	*	0	0	GAATATCGACGTCTGGCCCCCTTCGGGCGATCTATTTGAAGAGAGTGGCAATGTCGTCGAAGGTCAAGACACCCA	555555555555555555555555555555555555555555555555555555555555555555555555555
16	0	0	240	255	75M	*	0	0	GGTGCCCTAAACACTTACACCGGAGCCCGTGGGTGTCTTGACCTTCGACGACATTGCCACTCTCTTCAACTCGAT	555555555555555555555555555555555555555555555555555555555555555555555555555
17	0	0	230	255	75M	*	0	0	CCTTCGGGCGATCTATTTGAAGAGAGTGGCAATGTCGTCGAAGGTCAAGACACCCACGGGCTCCGGTGTAAGTGT	555555555555555555555555555555555555555555555555555555555555555555555555555
18	0	0	240	255	75M	*	0	0	ATCTATTTGAAGAGAGTGGCAATGTCGTCGAAGGTCAAGACACCCACGGGCTCCGGTGTAAGTGTTTAGGGCACC	555555555555555555555555555555555555555555555555555555555555555555555555555
19	0	0	834	255	75M	*	0	0	CGGCTCTTCTCGAGCGTGGCATTGATAACGTTTCACGTTATCCAATTGGGTACAGCCAGTTCGGTGTCCCTGGAC	555555555555555555555555555555555555555555555555555555555555555555555555555
20	0	0	76	255	75M	*	0	0	ATGATTTTGCTGCCTATGGCGGAATGACAGCGAAATGCGCAGAGCTTAACTTATTGATGTGTTGCCGTGATAGGT	555555555555555555555555555555555555555555555555555555555555555555555555555
21	0	0	806	255	75M	*	0	0	CATTAGCATGGAAGCCTTTAATAGGCAGGTCCAGGGACACCGAACTGGCTGTAGCCAATTGGATAACGTGAAACG	555555555555555555555555555555555555555555555555555555555555555555555555555
22	0	0	327	255	75M	*	0	0	GCTTAGGGACACTTTCCGCGTAGAAGTAAGCTATTCTGGCTATTCCCCTTTGTAGCACGCTCGATTCAAGCCTCG	555555555555555555555555555555555555555555555555555555555555555555555555555
23	0	0	622	255	75M	*	0	0	AGAGCAAGTTAATGGCCAGCTTAAAGAAGCAGAGGTGTCGAGAACTTAGAACGCTGCATCTGGCAGCTCGGGTCC	555555555555555555555555555555555555555555555555555555555555555555555555555
24	0	0	365	255	75M	*	0	0	AACCGCAAATTTTTGGGAGCGCGTTTTGTCTTCTGTTCGCTTAGGGACACTTTCCGAGTAGAAGTAAGCTATTCT	555555555555555555555555555555555555555555555555555555555555555555555555555
25	0	0	795	255	75M	*	0	0	GGACTCAATGCCATTAGCATGGAAGCCTTTAATAGGCAGGTCCAGGGACACCGAACTGGCTGTAGCCAATTGGAT	555555555555555555555555555555555555555555555555555555555555555555555555555
26	0	0	839	255	75M	*	0	0	GAGAACGGCTCTTCTCGAGCGTGGCATTGATAACGTTTCACGTTATCCAATTGGCTACAGCCAGTTCGGTGTCCC	555555555555555555555555555555555555555555555555555555555555555555555555555
27	0	0	653	255	75M	*	0	0	TAGCAAAACCGTCGCGCCCCCAGTTGATAGTAGAGCAAGTTAATGGCCAGCTTAAAGAAGCAGAGGTGTCGAGAA	555555555555555555555555555555555555555555555555555555555555555555555555555
28	0	0	404	255	75M	*	0	0	GTCAAGTTACCCAATTATTACTCCTTCAGGGATCAAACGAACCGCAAATTTTTGGGTGCGCGTTTTGTCTTCTGT	555555555555555555555555555555555555555555555555555555555555555555555555555
29	0	0	724	255	75M	*	0	0	GTCCTGAGATTAGAATACAGCCATGTGCTTATGCCATATAAGTATCCGTGTTCGCATAACGATGGCCGTCTTAGC	555555555555555555555555555555555555555555555555555555555555555555555555555
30	0	0	628	255	75M	*	0	0	GAGCTGCCAGATGCAGCGTTCTAAGTTCTCGACACCACTGCTTCTTTAAGCTGGCCATTAACTTGCTCTACTATC	555555555555555555555555555555555555555555555555555555555555555555555555555
31	0	0	580	255	75M	*	0	0	AACTTAGAACGCTGCATCTGGCAGCTCGGGTCCGGTACTAGCAACATTGGACGCCTGGGGTAACAAGGGCATCTT	555555555555555555555555555555555555555555555555555555555555555555555555555
32	0	0	506	255	75M	*	0	0	TCCACTTTAATTTCAGCCCCGTCCTCCTCGCGTGTTCCGCTACCGCGAGTATACAAACCGCTAGGCAGAATTATA	555555555555555555555555555555555555555555555555555555555555555555555555555
33	0	0	450	255	75M	*	0	0	CTGAAGGAGTAATAATTGGGTAACTAGACAGCGACGCTCCTAGTCTACTAGAGTACTCCACTTTAATTTCAGCCC	555555555555555555555555555555555555555555555555555555555555555555555555555
34	0	0	788	255	75M	*	0	0	AATCTCAGGACTCAATGCCATTAGCATGGAAGCCTTTAATAGGCAGGTCCAGGGACACCGAACTGGCTGTAGCCA	555555555555555555555555555555555555555555555555555555555555555555555555555
35	0	0	470	255	75M	*	0	0	CGGAACACGCGAGGAGGACGGGGCTGAAATTAAAGTGGAGTACTCTAGTAGACTAGGAGCGTCGCTGTCTAGTTA	555555555555555555555555555555555555555555555555555555555555555555555555555
36	0	0	487	255	75M	*	0	0	TTGTATACTCGCGGTAGCGGAACACGCGAGGAGGACGGGGCTGAAATTAAAGTTGAGTACTCTAGTAGACTAGGA	555555555555555555555555555555555555555555555555555555555555555555555555555
37	0	0	2	255	75M	*	0	0	TACAATGGAGGTATCGCCCGCCACGATCATAGGGACTGTTATTAGAGGTAACGCTGTCCAAGGCGGCAGCACATC	555555555555555555555555555555555555555555555555555555555555555555555555555
38	0	0	594	255	75M	*	0	0	GCAGAGGTGTCGAGAACTTAGAACGCTGGATCTGGCAGCTCGGGTCCGGGCCTAGCAACATTGGACGCCAGGGGT	555555555555555555555555555555555555555555555555555555555555555555555555555
39	0	0	674	255	75M	*	0	0	TTCGCATAACGATGGCCGTCTTAGGAAAACCGTCGCGCCCCCAGTTGATAGTAGAGCAAGTTAATGGCCAGCTTA	555555555555555555555555555555555555555555555555555555555555555555555555555
40	0	0	344	255	75M	*	0	0	GTGCTACAAAGGGGAATAGCCAGAATAGCTTACTTCTACTCGGAAAGTGTCCCTAAGCGAACAGAAGACAAAACG	555555555555555555555555555555555555555555555555555555555555555555555555555
41	0	0	699	255	75M	*	0	0	TATCAACTTGGGGCGCGACGGTTTTGCTAAGACGGCCATCGTTATGCGAACAGGGATACTAATATGGCATAAGCA	555555555555555555555555555555555555555555555555555555555555555555555555555
42	0	0	814	255	75M	*	0	0	ATTGATAACGTTTCACGTTATCCAATTGGCTACAGCCAGTTCGGTGTCCCTGGACCTGCCTATTAAAGGCTTCCA	555555555555555555555555555555555555555555555555555555555555555555555555555
43	0	0	329	255	75M	*	0	0	AGGCTTGAATCGAGCGTGCTACAAAGGGGAATAGCCAGAATAGCTTACTTCTACTCGGAAAGTGTCCCTAAGCGA	555555555555555555555555555555555555555555555555555555555555555555555555555
44	0	0	702	255	75M	*	0	0	ATGTGCTTATGCCATATTAGTCTCCGTGTTCGCATAACGATGGCCGTCTTAGCAAAACCGTCGCGCCCCCAGTTG	555555555555555555555555555555555555555555555555555555555555555555555555555
45	0	0	916	255	75M	*	0	0	CGTTCGACCGGTAAAGCTAGACTTACTTTTATAATATTTGTACCAGAGCTTTGGATAGAGGCACAAGCGCAGCTC	555555555555555555555555555555555555555555555555555555555555555555555555555
46	0	0	157	255	75M	*	0	0	TATGCTTCATTGACTCGCACCGAGGAGTTAGCATAATGTGGCACAGCACTAGCAGAATATCGACGTCTGGCCCCC	555555555555555555555555555555555555555555555555555555555555555555555555555
47	0	0	277	255	75M	*	0	0	TGTAGCACGCTCGATTCAAGCCTCGTTCATCACTGCGGGTGCCCTAAACACTTACACCGGAGCCCGTGGGTGTCT	555555555555555555555555555555555555555555555555555555555555555555555555555
48	0	0	383	255	75M	*	0	0	TGGGCAAGTGTCCCTAAGCGAACAGAAGACAAAACGCGCACCCAAACATTTGCGGTTCGTTTGATCCCTGAAGGA	555555555555555555555555555555555555555555555555555555555555555555555555555
49	0	0	429	255	75M	*	0	0	ACTCTAGTAGACTAGGAGCGTCGCTGTCTAGTTACCCAATTATTACTCCTTCAGGGATCAAACGAACCGCAAATT	555555555555555555555555555555555555555555555555555555555555555555555555555
50	0	0	519	255	75M	*	0	0	AACAAGGGCATCTTATAATTCTGCCTAGCGGTTTGTATACTCGCGGTAGCGGAACACGCGAGGAGGACGGGGCTG	555555555555555555555555555555555555555555555555555555555555555555555555555
51	0	0	764	255	75M	*	0	0	TGGACCTGCCTATTAAAGGCTTCCATGCTAATGGCATTGAGTCCTGAGATTAGAATACAGCCATGTGCTTATGCC	555555555555555555555555555555555555555555555555555555555555555555555555555
52	0	0	51	255	75M	*	0	0	GTTAAGCTCTGCGCATTTCGCTGTCATTCCGCCATAGGCAGCAAAATCATACAATGGAGGTATCGCCCGCCACGA	555555555555555555555555555555555555555555555555555555555555555555555555555
53	0	0	44	255	75M	*	0	0	TCTGCGCATTTCGCTGTCATACCGCCATAGGCAGCAAAATCATACAATGGAGGTATCGCCCGCCACGATCATAGG	555555555555555555555555555555555555555555555555555555555555555555555555555
54	0	0	775	255	75M	*	0	0	ATGGCTGTATTCTAATCTCAGGACTCAATGCCATTAGCATGGAAGCCTTTAATAGGCAGGTCCAGGGACACCGAA	555555555555555555555555555555555555555555555555555555555555555555555555555
55	0	0	465	255	75M	*	0	0	CACGCGAGGAGGACGGGGCTGAAATTAAAGTGGAGTACTCTAGTAGACTAGGAGCGTCGCTGTCTAGTTACCCAA	555555555555555555555555555555555555555555555555555555555555555555555555555
56	0	0	749	255	75M	*	0	0	AAGGCTTCCATGCTAATGGCATTGAGTCCTGAGATTAGAATACAGCCATGTGCTTATGCCATATTAGTATCCGTG	555555555555555555555555555555555555555555555555555555555555555555555555555
57	0	0	355	255	75M	*	0	0	TTTTGGGTGCGCGTTTTGTCTTCTGTTCGCTTAGGGACACTTTCCGAGTAGAAGTAAGCTATTCTGGCTATTCCC	555555555555555555555555555555555555555555555555555555555555555555555555555
58	0	0	225	255	75M	*	0	0	GGCCCCCTTCGGGCGATCTATTTGAAGAGAGTGGCAATGTCGTCGAAGGTCAAGACACCCACGGGGTCCGGTGTA	555555555555555555555555555555555555555555555555555555555555555555555555555
59	0	0	879	255	75M	*	0	0	TTGTACCAGAGCTTTGGATAGAGGCACAAGCGCAGCTCCTGAGAACGGCTCTTCTCGAGCGTGGCATTGATAACG	555555555555555555555555555555555555555555555555555555555555555555555555555
60	0	0	41	255	75M	*	0	0	GCGCATTTCGCTGTCATTCCGCCATAGGCAGCAAAATCATACAATGGAGGTATCGCCCGCCACGATCATAGGGAC	555555555555555555555555555555555555555555555555555555555555555555555555555
61	0	0	801	255	75M	*	0	0	CACGTTATCCCATTGGCTACAGCCAGTTCGGTGTCCCTGGACCTGCCTATTAAAGGCTTCCATGCTAATGGCATT	555555555555555555555555555555555555555555555555555555555555555555555555555
62	0	0	558	255	75M	*	0	0	AGCTCGGGTCCGGGACTAGCAACATTGGACGCCTGGGGTAACAAGGGCATCTTATAATTCTGCCTAGCGGTTTGT	555555555555555555555555555555555555555555555555555555555555555555555555555
63	0	0	541	255	75M	*	0	0	TCCGCTACCGCGAGTATACAAACCGCTAGGCAGAATTATAAGATGCCCTTGTTACCCCAGGCGTCCAATGTTGCT	555555555555555555555555555555555555555555555555555555555555555555555555555
64	0	0	34	255	75M	*	0	0	TCGCTGTCATTCCGCCATAGGCAGCAAAATCATACAATGGAGGTATCGCCCGCGACGATCATAGGGACTGTTATT	555555555555555555555555555555555555555555555555555555555555555555555555555
65	0	0	471	255	75M	*	0	0	AACTAGACAGCGACGCTCCTATTGTACTAGAGTACTCCACTTTAATTTCAGCCCCGTCCTCCTCGCGTGTTCCGC	555555555555555555555555555555555555555555555555555555555555555555555555555
66	0	0	610	255	75M	*	0	0	TGGCCAGCTTAAAGAAGCAGAGGTGTCGAGAACTTAGAACGCTGCATCTGGCAGCTCGGGTCCGGGACTAGCAAC	555555555555555555555555555555555555555555555555555555555555555555555555555
67	0	0	479	255	75M	*	0	0	AGCGACGCTCCTAGTCTACTAGAGTACTCCACTTTAATTTCAGCCCCGTCCTCCTCGCGTGTTCCGCTACCGCGA	555555555555555555555555555555555555555555555555555555555555555555555555555
68	0	0	244	255	75M	*	0	0	ATTTGAAGAGAGTGGCAATGTCGTCGAAGGTCAAGACACCCACGGGCTCCGGTGTAAGTGTTTAGGGCACCCGCA	555555555555555555555555555555555555555555555555555555555555555555555555555
69	0	0	224	255	75M	*	0	0	TGGCCCCCTTCGGGCGATCTATTTGAAGAGAGTGGCAATGTCGTCGAAGGTCAAGACACCCACGGGCTCCGGTGT	555555555555555555555555555555555555555555555555555555555555555555555555555
70	0	0	376	255	75M	*	0	0	CTTCTACTCGGAAAGTGTCCCTAAGCGAACAGAAGACAAAACGCGCACCCAAAAATTTGCGGTTCGTTTGATCCC	555555555555555555555555555555555555555555555555555555555555555555555555555
71	0	0	503	255	75M	*	0	0	AATTCTGCCTAGCGGTTTGTATACTCGCGGTAGCGGAACACGCGAGGAGGACGGGGCTGAAATTAAAGTGGAGTA	555555555555555555555555555555555555555555555555555555555555555555555555555
72	0	0	481	255	75M	*	0	0	CGACGCTCCTAGTCTACTAGAGTACTCCACTTTAATTTCAGCCCCGTCCTCCTCGCGTGTTCCGCTACCGCGAGT	555555555555555555555555555555555555555555555555555555555555555555555555555
73	0	0	154	255	75M	*	0	0	GTCTATGCTTCATTGACTCGCACCGAGGAGTTAGCAGAATGTGCCACATCACTAGCAGAATATCGACGTCTGGCC	555555555555555555555555555555555555555555555555555555555555555555555555555
74	0	0	912	255	75M	*	0	0	TCAGGAGCTGGGCTTGTGCCTCTATCCAAAGCTCTGGTACAAATATTATAAAAGTAAGTGTAGCTTTACCGGTGG	555555555555555555555555555555555555555555555555555555555555555555555555555
75	0	0	177	255	75M	*	0	0	CGAGGAGTTAGCAGAATGTGCCACAGCACTAGCAGAATATCGACGTCTGGCCCCCTTCGGGCGATCTATTTGAAG	555555555555555555555555555555555555555555555555555555555555555555555555555
76	0	0	875	255	75M	*	0	0	ACCAGAGCTTTGGATAGAGGCACAAGCGCAGCTCCTGAGAACGGCTCTTCTCGAGCGTGGCATTGATAACGTTTC	555555555555555555555555555555555555555555555555555555555555555555555555555
77	0	0	663	255	75M	*	0	0	ATGGCCGTCTTAGCAAAACCGTCGCGCCCCCAGTTGATAGTAGAGCAAGTTAATGGCCAGCTTAAAGAAGCAGAG	555555555555555555555555555555555555555555555555555555555555555555555555555
78	0	0	733	255	75M	*	0	0	TGGCATTGAGTCCTGAGATTAGAATACAGCCATGTGCTTATGCCATATTAGTATCCGTGTTCGCATAACGATGGC	555555555555555555555555555555555555555555555555555555555555555555555555555
79	0	0	244	255	75M	*	0	0	AATTGAAGAGAGTGGCAATGTCGTCGAAGGTCAAGACACCCACGGGGTCCGGTGTAAGTGTTTAGGGCACCCGCA	555555555555555555555555555555555555555555555555555555555555555555555555555
80	0	0	639	255	75M	*	0	0	TGCAGCGTTCTAAGTTCTCGACACCTCTGCTTCTTTAAGCTGGCCATTAACATGCTCTACTATCAACTGGGGGCG	555555555555555555555555555555555555555555555555555555555555555555555555555
81	0	0	569	255	75M	*	0	0	GGCAGAATTATAAGATGCCCTTGTTACCCCAGGCGTCCAATGTTGCTAGTCCCGGACCCGAGCTGCCAGATGCAG	555555555555555555555555555555555555555555555555555555555555555555555555555
82	0	0	210	255	75M	*	0	0	AGAATATCGACGTCTGGCCCCCTTCGGGCGATCTCTTTGAAGAGAGTGTCAATGTCGTCGAAGGTCAAGACACCC	555555555555555555555555555555555555555555555555555555555555555555555555555
83	0	0	819	255	75M	*	0	0	GTGGCATTGATAACGTTTCACGTTATCCAATTGGCTACATCCAGTTCGGTGTCCCTGGACCTGCCTATTAAAGGC	555555555555555555555555555555555555555555555555555555555555555555555555555
84	0	0	90	255	75M	*	0	0	GAAGCATAGACACCACCTATCACGGCAACACATCAATAAGTTAAGCTCTGCGCATTTCGCTGTCAATCCGCCATA	555555555555555555555555555555555555555555555555555555555555555555555555555
85	0	0	54	255	75M	*	0	0	TAAGTTAAGCTCTGCGCATTTCGCTGTCATTCCGCCATAGGCAGCAAAATCATACAATGGAGGTATCGCCCGCCA	555555555555555555555555555555555555555555555555555555555555555555555555555
86	0	0	8	255	75M	*	0	0	AAATCATACAATGGAGGTATCGCCCGCCACGATCATAGGGACTGTTATTAGAGGTAACGCTGTCCAAGGCGGCAG	555555555555555555555555555555555555555555555555555555555555555555555555555
87	0	0	696	255	75M	*	0	0	TACTATCAACTGGGGGCGCGACGGTTTTGCTAAGACGGCCATCGTTATGCGAACACGGATACAAATATGGCATAA	555555555555555555555555555555555555555555555555555555555555555555555555555
88	0	0	903	255	75M	*	0	0	AAGCTACACTTACTTTTATAATATTTGTCCCAGAGCTTTGGATAGAGGCACAAGCGCAGCTCCTGAGAACGGCTC	555555555555555555555555555555555555555555555555555555555555555555555555555
89	0	0	408	255	75M	*	0	0	CGCTGTCTAGTTACCCAATTATTACTCCTTCAGGGATCAAACGAACCGCAAATTTTTGGGTGCGCGTTTTGTCTT	555555555555555555555555555555555555555555555555555555555555555555555555555
90	0	0	753	255	75M	*	0	0	GATACTAATATGGCATAAGCACATGGCTGTATTCTAATCTCAGGACTCAATGCCATTAGCATGGAAGCCTTTAAT	555555555555555555555555555555555555555555555555555555555555555555555555555
91	0	0	585	255	75M	*	0	0	GCCCTTGTTACCCCAGGCGTCCAATGTTGCTAGTCCCGGACCCGAGCTGCCAGATGCAGCGTTCTAAGTTCTCGA	555555555555555555555555555555555555555555555555555555555555555555555555555
92	0	0	633	255	75M	*	0	0	CAGTTGATAGTAGAGCAAGTTAATGGCCAGCTTAAAGAAGCAGAGGTGTCGAGAACTTAGAACGCTGCATCTGGC	555555555555555555555555555555555555555555555555555555555555555555555555555
93	0	0	536	255	75M	*	0	0	CGTGTTCCGCTACCGCGAGAATACAAACCGCTAGGCAGAATTATAAGATGCCCTTGTTACCCCAGGCGTCCACTG	555555555555555555555555555555555555555555555555555555555555555555555555555
94	0	0	716	255	75M	*	0	0	ATTAGAATACAGCCATGTGCTTATGCCATATTAGTATCCGTGTTCGCATAACGATGGCCGTCTTAGCAAAACCGT	555555555555555555555555555555555555555555555555555555555555555555555555555
95	0	0	926	255	75M	*	0	0	TAACAGCTCCCGTTCGACCGGTAAAGCTACACTTACTTTTATAATATTTTTACCAGAGCTTTGGATAGAGGCACA	555555555555555555555555555555555555555555555555555555555555555555555555555
96	0	0	396	255	75M	*	0	0	ACCCAATTATTACTCCTTCAGGGATCAAACGAACCGCAAATTTTTGGGTGCGCGTTTTGTCTTCTGTTCGCTTAG	555555555555555555555555555555555555555555555555555555555555555555555555555
97	0	0	334	255	75M	*	0	0	TGAATCGAGCGTGCTACAAAGGGGAATAGCCAGAATAGCTTACTTCTACTCGGAAAGTGTCCCTAAGCGAACAGA	555555555555555555555555555555555555555555555555555555555555555555555555555
98	0	0	418	255	75M	*	0	0	GCGCACCCAAAAATTTGCGGTTCGTTTGATCCCTGAAGGAGTAATAATTGGGTAACTAGACAGCGACGCTCCTAG	555555555555555555555555555555555555555555555555555555555555555555555555555
99	0	0	636	255	75M	*	0	0	AGATGCAGCGTTCTAAGTTCTCGACACCTCTGCTTCTTTAAGCTGGCCATTAACTTGCTCTACTATCAACTGGGG	555555555555555555555555555555555555555555555555555555555555555555555555555
100	0	0	86	255	75M	*	0	0	TGCCTATGGCGGAATGACAGCGAAATGCGCAGAGCTTAACTTATTGATGTGTTGCCGTGATAGGTGGTGTCTATG	555555555555555555555555555555555555555555555555555555555555555555555555555
101	0	0	1	255	75M	*	0	0	AGATGTGCTGCCGCCTTGGACAGCGTTACCTCTAATAACAGTCCCTATGATCGTGGCGGGCGATACCTCCATTGT	555555555555555555555555555555555555555555555555555555555555555555555555555
```

END_DOC

**/
@Program(name="samretrieveseqandqual",description="I have a query-sorted BAM file without read/qual sequences and a FASTQ file with the read/qual sequences. Is there a tool to add seq to BAM?  for @sjackman https://twitter.com/sjackman/status/575368165531611136")
public class SamRetrieveSeqAndQual extends Launcher
	{
	private static final Logger LOG = Logger.build(SamRetrieveSeqAndQual.class).make();


	@Parameter(names={"-o","--output"},description=OPT_OUPUT_FILE_OR_STDOUT)
	private File bamOut = null;
	@Parameter(names={"-F"},description=" (fastq / fastqF) required",required=true)
	private File fastqFin = null;
	@Parameter(names={"-R"},description=" (fastq / fastqR) required",required=true)
	private File fastqRin = null;

	@ParametersDelegate
	private WritingBamArgs writingBamArgs = new WritingBamArgs();
	
	private String normalizeFastqName(String s)
		{
		int w=s.indexOf(' ');
		if(w!=-1) s=s.substring(0,w);
		if(s.endsWith("/1") || s.endsWith("/2")) s=s.substring(0,s.length()-2);
		return s;
		}
	
	@Override
	public int doWork(List<String> args) {
		FastqReader[] fastqReaders=null;
		SamReader samReader=null;
		SAMFileWriter samWriter=null;
		SAMRecordIterator iter=null;
		try
			{
			
			if(fastqFin==null)
				{
				LOG.error("undefined fastq file");
				return -1;
				}
			else 
				{
				LOG.info("opening "+fastqFin);
				FastqReader r1=new FastqReader(fastqFin);
				if(fastqRin==null)
					{
					fastqReaders=new FastqReader[]{r1};
					}
				else
					{
					LOG.info("opening "+fastqRin);
					FastqReader r2=new FastqReader(fastqRin);
					fastqReaders=new FastqReader[]{r1,r2};
					}
				}

			samReader = super.openSamReader(oneFileOrNull(args));
			final SAMFileHeader.SortOrder sortOrder = samReader.getFileHeader().getSortOrder();
			if(sortOrder==null)
				{
				LOG.warning("undefined sort order read are in the sam order");
				}
			else if(!sortOrder.equals(SAMFileHeader.SortOrder.queryname))
				{
				LOG.error("Bad Sort Order. Sort this input on read name");
				return -1;
				}
			
			SAMFileHeader header= samReader.getFileHeader().clone();
			
			SAMProgramRecord prg=header.createProgramRecord();
			prg.setCommandLine(this.getProgramCommandLine());
			prg.setProgramName(this.getProgramName());
			prg.setProgramVersion(this.getVersion());
			
			samWriter  = writingBamArgs.openSAMFileWriter(bamOut, header, true);
			iter=samReader.iterator();
			SAMSequenceDictionaryProgress progress=new SAMSequenceDictionaryProgress(header.getSequenceDictionary());
			FastqRecord currFastq[]=new FastqRecord[]{null,null};
			while(iter.hasNext())
				{
				SAMRecord rec= progress.watch(iter.next());
				String readName = rec.getReadName();
				int fastq_index = 0;
				if(rec.getReadPairedFlag())
					{
					if(fastqReaders.length!=2)
						{
						LOG.error("Not paired but number of fastq!=2");
						return  -1;
						}
					fastq_index = (rec.getFirstOfPairFlag()?0:1);
					}
				else
					{
					if(fastqReaders.length!=1)
						{
						LOG.error("Not paired but number of fastq!=1");
						return  -1;
						}
					fastq_index=0;
					}
				
				if(sortOrder==SAMFileHeader.SortOrder.queryname)
					{
					while(currFastq[fastq_index]==null || normalizeFastqName(currFastq[fastq_index].getReadName()).compareTo(readName)<0)
						{
						if(! fastqReaders[ fastq_index ].hasNext())
							{
							LOG.error("Read Missing for "+readName);
							return -1;
							}
						currFastq[fastq_index] = fastqReaders[ fastq_index ].next();
						if(normalizeFastqName(currFastq[fastq_index].getReadName()).compareTo(readName)>0)
							{
							LOG.error("Read Missing for "+readName);
							return -1;
							}
						}
					}
				else
					{
					if(! fastqReaders[ fastq_index ].hasNext())
						{
						LOG.error("Read Missing for "+readName);
						return -1;
						}
					currFastq[fastq_index] = fastqReaders[ fastq_index ].next();
					}
				if(normalizeFastqName(currFastq[fastq_index].getReadName()).compareTo(readName)!=0)
					{
					LOG.error("Read Missing/Error for "+readName+" current:" + currFastq[fastq_index].getReadName());
					return -1;
					}
				String fastqBases = currFastq[fastq_index].getReadString();
				String fastqQuals = currFastq[fastq_index].getBaseQualityString();
				/* handle orientation */
				if(!rec.getReadUnmappedFlag() && rec.getReadNegativeStrandFlag())
					{
					fastqBases = AcidNucleics.reverseComplement(fastqBases);
					StringBuilder sb=new StringBuilder(fastqQuals.length());
					for(int i=fastqQuals.length()-1;i>=0;--i)
						sb.append(fastqQuals.charAt(i));
					fastqQuals =  sb.toString();
					}
				/* remove hard clip */
				Cigar cigar=rec.getCigar();
				if(cigar!=null)
					{
					List<CigarElement> ceList=cigar.getCigarElements();
					if(!ceList.isEmpty())
						{
						CigarElement ce = ceList.get(ceList.size()-1);
						if(ce.getOperator()==CigarOperator.HARD_CLIP)
							{
							fastqBases = fastqBases.substring(0, fastqBases.length()-ce.getLength());
							fastqQuals = fastqQuals.substring(0, fastqQuals.length()-ce.getLength());
							}
						ce = ceList.get(0);
						if(ce.getOperator()==CigarOperator.HARD_CLIP)
							{
							fastqBases = fastqBases.substring(ce.getLength());
							fastqQuals = fastqQuals.substring(ce.getLength());
							}
						}
					}
				rec.setBaseQualityString(fastqQuals);
				rec.setReadString(fastqBases);
				samWriter.addAlignment(rec);
				}
			progress.finish();
			return 0;
			}
		catch (Exception err)
			{
			LOG.error(err);
			return -1;
			}
		finally
			{
			if(fastqReaders!=null)
				for(FastqReader r:fastqReaders)
					CloserUtil.close(r);
			CloserUtil.close(iter);
			CloserUtil.close(samReader);
			CloserUtil.close(samWriter);
			}
		}


	public static void main(String[] args)
		{
		new SamRetrieveSeqAndQual().instanceMainWithExit(args);
		}

	}
